#ifndef  __PERIPHERALS_DES_H__
#define  __PERIPHERALS_DES_H__

#include "sys.h"

typedef struct 
{
    rcu_periph_enum                      rcu_clk;           /*<! GPIO端口时钟 */
    uint32_t                             port;              /*<! GPIO端口 */
    uint32_t                             pin;               /*<! GPIO引脚编号 */
    uint32_t                             mode;              /*<! GPIO输入输出模式 */
    uint32_t                             pull;              /*<! GPIO上拉模式 */
    uint8_t                              otype;             /*<! GPIO输出类型 */
    uint32_t                             speed;             /*<! GPIO输出速度 */
    uint32_t                             alt_func;          /*<! 复用功能编号 */
    uint8_t                              irq;               /*<! 中断线 */

}bsp_gpio_t;

typedef struct 
{
    uint8_t                              irq;               /*<! 中断线 */
    uint8_t                              pre_priority;      /*<! 主优先级 */
    uint8_t                              sub_priority;      /*<! 子优先级 */

}bsp_nvic_t;

typedef struct 
{
    rcu_periph_enum                     rcu_clk;        
    uint32_t                            dma_periph;         /*<! DMA外设，DMA0/DMA1 */
    dma_channel_enum                    channel;            /*<! DMA通道 */
    dma_subperipheral_enum              sub_periph;         /*<! DMA通道外设 */
    dma_single_data_parameter_struct    dma_init;           /*<! DMA外设初始化*/
    IRQn_Type                           irq;                /*<! 中断线 */
    uint8_t                             pre_priority;       /*<! 主优先级 */
    uint8_t                             sub_priority;       /*<! 子优先级 */    
    uint32_t                            tran_int;           /*<! 传输完成中断、半中断 */
    volatile uint8_t                    *tran_buff;         /*<! 指向DMA的缓存buffer */

}bsp_dma_t;

typedef enum
{
    TX_DISABLE = (1 << 0),
    TX_ENABLE  = (1 << 1),

    RX_DISABLE = (1 << 2),
    RX_ENABLE  = (1 << 3),

}bsp_uart_mode_e;

typedef void (*uart_idle_int_cb_fn)(uint32_t);

typedef struct 
{   
    rcu_periph_enum                     rcu_clk;            /*<! 外设时钟 */
    uint32_t                            usart_periph;       /*<! 串口外设 */
    uint32_t                            baudrate;           /*<! 波特率 */
    uint32_t                            parity;             /*<! 校验位 */
    uint32_t                            data_len;           /*<! 数据位长度 */
    uint32_t                            stop_bit;           /*<! 停止位 */
    uint32_t                            uart_mode;          /*<! 串口模式，发送/接收使能/失能，只要使能发送或接收，就使用DMA传输，同时开启接收空闲中断、DMA发送完成中断和接收完成中断，关闭DMA的半中断 */
    IRQn_Type                           irq;                /*<! 中断线 */
    uint8_t                             pre_priority;       /*<! 主优先级 */
    uint8_t                             sub_priority;       /*<! 子优先级 */
    bsp_gpio_t                          tx_pin;             /*<! UART TX GPIO配置 */
    bsp_gpio_t                          rx_pin;             /*<! UART RX GPIO配置 */
    bsp_dma_t                           tx_dma;             /*<! UART TX DMA配置 */
    bsp_dma_t                           rx_dma;             /*<! UART RX DMA配置 */
    uint32_t                            rec_len;            /*<! UART接收的字节数 */
    uint32_t                            rec_max;            /*<! UART接收的最大字节数 */
    uart_idle_int_cb_fn                 uart_idle_int_cb;   /*<! UART接收空闲中断回调函数 */    

}bsp_uart_t;

#endif   /* __PERIPHERALS_DES_H__ */
